// ┌────────────────────────────────────────────────────────────────────┐ \\
// │ F R E E B O A R D                                                  │ \\
// ├────────────────────────────────────────────────────────────────────┤ \\
// │ Copyright © 2013 Jim Heising (https://github.com/jheising)         │ \\
// │ Copyright © 2013 Bug Labs, Inc. (http://buglabs.net)               │ \\
// ├────────────────────────────────────────────────────────────────────┤ \\
// │ Licensed under the MIT license.                                    │ \\
// └────────────────────────────────────────────────────────────────────┘ \\

(function () {
    //json格式的数据源(原始的)
    var jsonDatasource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }

            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);

        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }

            var requestURL = currentSettings.url;

            if (errorStage == 2 && currentSettings.use_thingproxy) {
                requestURL = (location.protocol == "https:" ? "https:" : "http:") + "//thingproxy.freeboard.io/fetch/" + encodeURI(currentSettings.url);
            }

            var body = currentSettings.body;

            // Can the body be converted to JSON?
            // 将请求body转换为json格式
            if (body) {
                try {
                    body = JSON.parse(body);
                }
                catch (e) {
                }
            }

            $.ajax({
                url: requestURL,
                dataType: (errorStage == 1) ? "JSONP" : "JSON",
                type: currentSettings.method || "GET",
                data: body,
                beforeSend: function (xhr) {
                    try {
                        _.each(currentSettings.headers, function (header) {
                            var name = header.name;
                            var value = header.value;

                            if (!_.isUndefined(name) && !_.isUndefined(value)) {
                                xhr.setRequestHeader(name, value);
                            }
                        });
                    }
                    catch (e) {
                    }
                },
                success: function (data) {
                    lockErrorStage = true;

                    updateCallback(data);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //加载数据源插件
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "JSON",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],
        // ** newInstance（settings，newInstanceCallback，updateCallback）**（必需）：在请求此插件的新实例时将调用的函数。
        // * ** settings **：具有用户设置的初始设置的javascript对象。对象中属性的名称将对应于上面定义的设置名称。
        // * ** newInstanceCallback **：当插件的新实例准备就绪时您将调用的回调函数。此函数需要一个参数，它是插件对象的新实例。
        // * ** updateCallback **：一个回调函数，如果您的数据源具有重新计算的干舷更新，您将调用该函数。此函数需要单个参数，该参数是具有新的更新数据的javascript对象。你应该坚持这个参考，并在需要时调用它。
        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonDatasource(settings, updateCallback));
        }
    });

    var jsonAlarmDataSource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            // console.log('requestURL:', requestURL)
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),
                // url: "http://"+baseURL+":"+basePort+"/camel/rest/ksh/warninglistrecord/test",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    console.log('data:',data)
                    // window.jsondata = data
                    // var s = replace(data)
                    // console.log('s:',s)
                    var obj = JSON.parse(data);
                    updateCallback(obj);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //告警信息
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "告警信息",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonAlarmDataSource(settings, updateCallback));
        }
    });

    var jsonLineFlowDataSource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            // console.log('requestURL:', requestURL)
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/totalFlow/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // window.jsondata = data
                    // var s = replace(data)
                    // console.log('s:',s)
                    var obj = JSON.parse(data);
                    // console.log(obj)
                    updateCallback(obj);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //智慧运维总览
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "智慧运维总览",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonLineFlowDataSource(settings, updateCallback));
        }
    });

    var jsonRAMDataSource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            // console.log('requestURL:', requestURL)
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/serverManager/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // console.log('data========', data)
                    // var str = data
                    var obj = JSON.parse(data);
                    // console.log(obj)
                    updateCallback(obj);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //智慧运维设备总览
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "智慧运维设备总览",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonRAMDataSource(settings, updateCallback));
        }
    });

    var jsonScaleDataSource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            // console.log('requestURL:', requestURL)
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/appManager/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // console.log('data:', data)
                    // var str = data
                    // str = str.substring(0, str.lastIndexOf(',')) + '}'
                    // window.jsondata = data
                    // var s = replace(data)
                    // console.log('s:',s)
                    var obj = JSON.parse(data);
                    // console.log(obj)
                    updateCallback(obj);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //告警统计
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "告警统计",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonScaleDataSource(settings, updateCallback));
        }
    });

    var jsonReportFlowDataSource = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),
                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/operations/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // console.log(data);
                    var obj = JSON.parse(data);
                    updateCallback(obj);//回调函数
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //线路总流量
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "线路总流量",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonReportFlowDataSource(settings, updateCallback));
        }
    });

    var jsonAllFacilityList = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),
                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/storageStatistics/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // console.log(data);
                    var obj = JSON.parse(data);
                    updateCallback(obj);//回调函数
                    // console.log(obj)
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //业务健康情况
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "业务健康情况",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonAllFacilityList(settings, updateCallback));
        }
    });

    var jsonAllFacilityList = function (settings, updateCallback) {
        var self = this;
        var updateTimer = null;
        var currentSettings = settings;
        var errorStage = 0; 	// 0 =尝试标准请求
        // 1 =尝试JSONP
        // 2 =尝试thingproxy.freeboard.io
        var lockErrorStage = false;

        function updateRefresh(refreshTime) {
            if (updateTimer) {
                clearInterval(updateTimer);
            }
            updateTimer = setInterval(function () {
                self.updateNow();
            }, refreshTime);
        }

        updateRefresh(currentSettings.refresh * 1000);
        this.updateNow = function () {
            if ((errorStage > 1 && !currentSettings.use_thingproxy) || errorStage > 2) // We've tried everything, let's quit
            {
                return; // TODO: Report an error
            }
            var requestURL = currentSettings.url;

            //获取所有allcookies
            var allcookies = document.cookie;
            var arr = new Array();
            var access_token = window.sessionStorage.getItem('access_token');
            $.ajax({
                async: false,
                url: "http://" + baseURL + ':' + basePort + requestURL +'?ts='+(new Date()).getTime(),
                // url: "http://"+baseURL+":"+basePort+"/camel/rest/btzjjj/storageStatistics/getValue",
                dataType: "JSON",
                type: "GET",
                headers: {'access_token': access_token},
                // beforeSend: function(request) {
                //     request.setRequestHeader('access_token', access_token);
                // },
                success: function (data) {
                    // console.log(data);
                    var obj = JSON.parse(data);
                    updateCallback(obj);//回调函数
                    // console.log(obj)
                },
                error: function (xhr, status, error) {
                    if (!lockErrorStage) {
                        // TODO: Figure out a way to intercept CORS errors only. The error message for CORS errors seems to be a standard 404.
                        errorStage++;
                        self.updateNow();
                    }
                }
            });
        }

        function replace(a) {
            return a.replace(/'/g, '"')
        }

        this.onDispose = function () {
            clearInterval(updateTimer);
            updateTimer = null;
        }

        this.onSettingsChanged = function (newSettings) {
            lockErrorStage = false;
            errorStage = 0;

            currentSettings = newSettings;
            updateRefresh(currentSettings.refresh * 1000);
            self.updateNow();
        }
    };
    //拓扑图
    freeboard.loadDatasourcePlugin({
        // ** type_name **（必填）：此插件的唯一名称。此名称应尽可能唯一，以避免与其他插件发生冲突，并应遵循javascript变量和函数声明的命名约定。
        type_name: "拓扑图",
        settings: [
            {
                name: "url",
                display_name: "路径",
                // ** type **（必需）：此设置的预期输入类型。“text”将显示单个文本框输入。本文档中将包含其他类型的示例。
                type: "text"
            },
            {
                // ** name **（必填）：设置的名称。此值将在您的代码中用于检索用户指定的值。这应该遵循javascript变量和函数声明的命名约定。
                name: "use_thingproxy",
                // ** display_name **：调整此设置时将向用户显示的漂亮名称。
                display_name: "尝试代理",
                // ** description **：将在设置下方显示的文本，为用户提供任何额外信息。
                description: '首先将尝试直接JSON连接，如果失败，将尝试JSONP连接。如果失败，您可以使用thigPosiver，它可以解决API的许多连接问题。 <a href="https://github.com/Freeboard/thingproxy" target="_blank">更多信息</a>.',
                // ** type **（必需）：此设置的预期输入类型
                type: "boolean",
                // ** default_value **：此设置的默认值。
                default_value: true
            },
            {
                name: "refresh",
                display_name: "刷新时间",
                type: "number",
                // ** suffix **：后缀。
                suffix: "seconds",
                default_value: 5
            },
            {
                name: "method",
                display_name: "请求方式",
                // ** type **（必需）：option代表这是一个下拉选
                type: "option",
                options: [
                    {
                        name: "GET",
                        value: "GET"
                    },
                    {
                        name: "POST",
                        value: "POST"
                    },
                    {
                        name: "PUT",
                        value: "PUT"
                    },
                    {
                        name: "DELETE",
                        value: "DELETE"
                    }
                ]
            },
            {
                name: "body",
                display_name: "请求主体",
                type: "text",
                description: "请求的主体，通常只使用 POST"
            },
            {
                name: "headers",
                display_name: "请求首部",
                // ** type **（必需）：array代表这是一个数组
                type: "array",
                settings: [
                    {
                        name: "name",
                        display_name: "Name",
                        type: "text"
                    },
                    {
                        name: "value",
                        display_name: "Value",
                        type: "text"
                    }
                ]
            }
        ],

        newInstance: function (settings, newInstanceCallback, updateCallback) {
            newInstanceCallback(new jsonAllFacilityList(settings, updateCallback));
        }
    });
}());
